package persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import modelo.DetalleBoleta;
import modelo.ProductosMasVendidos;

/**
 *
 * @author Felipe
 */
public class DetalleBoletaDAO {

    private Connection conexion;

    public Connection getConexion() {
        return conexion;
    }

    public void setConexion(Connection conexion) {
        this.conexion = conexion;
    }

    public void Insertar(DetalleBoleta deta) {
        PreparedStatement sentencia = null;

        try {
            String codProd = deta.getCodProducto();
            int codBol = deta.getCodBoleta();
            int precioVenta = deta.getPrecio();
            int cantidad = deta.getCantidad();

            String sql = "insert into DETALLE_BOLETA (COD_BOLETA,COD_PRODUCTO,CANTIDAD,PRECIO) values(?,?,?,?)";
            sentencia = conexion.prepareStatement(sql);

            sentencia.setInt(1, codBol);
            sentencia.setString(2, codProd);
            sentencia.setInt(3, cantidad);
            sentencia.setInt(4, precioVenta);
            sentencia.executeUpdate();

//          sentencia.executeUpdate(sql);
        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("error al insertar detalle boleta", ex);
        } finally {
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }

        }
    }

    public Collection<DetalleBoleta> buscarTodosPorCodBol(int codBol) {
        Collection<DetalleBoleta> lista = new ArrayList<DetalleBoleta>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select d.COD_BOLETA, p.NOMBRE, d.COD_PRODUCTO, d.CANTIDAD ,d.PRECIO from DETALLE_BOLETA d join PRODUCTOS p using (COD_PRODUCTO) where COD_BOLETA = ?  ";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, codBol);
            System.out.println(sql);
            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    DetalleBoleta registro = new DetalleBoleta();
                    registro.setCodBoleta(resultado.getInt("COD_BOLETA"));
                    registro.setPrecio(resultado.getInt("PRECIO"));
                    registro.setCantidad(resultado.getInt("CANTIDAD"));
                    registro.setCodProducto(resultado.getString("COD_PRODUCTO"));
                    registro.setNombre(resultado.getString("NOMBRE"));
                    registro.setSubTotal(registro.getCantidad() * registro.getPrecio());
                    lista.add(registro);
                }
            } catch (NullPointerException ex) {
                return null;
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("error al buscar todos por cod boleta", ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    /**
     * favor utilizar el que busca entre fechas
     *
     * @return
     */
    @Deprecated

    Collection<ProductosMasVendidos> buscarMasVendidos() {
        Collection<ProductosMasVendidos> lista = new ArrayList<ProductosMasVendidos>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = " select distinct d.COD_PRODUCTO, p.NOMBRE, p.PRECIO_VENTA ,sum(d.CANTIDAD) as suma "
                    + "from ADMINISTRADOR.DETALLE_BOLETA d join ADMINISTRADOR.PRODUCTOS p using (COD_PRODUCTO)"
                    + " join ADMINISTRADOR.BOLETA b using (COD_BOLETA) where b.ESTADO = true "
                    + "group by d.COD_PRODUCTO, p.NOMBRE, p.PRECIO_VENTA order by suma desc";

            sentencia = conexion.prepareStatement(sql);
            resultado = sentencia.executeQuery();
            int cantidad = 0;
            int precio = 0;
            while (resultado.next()) {
                ProductosMasVendidos registro = new ProductosMasVendidos();
                registro.setCodProducto(resultado.getString("COD_PRODUCTO"));
                cantidad = resultado.getInt("SUMA");
                registro.setCantidad(cantidad);
                registro.setNombre(resultado.getString("NOMBRE"));
                precio = resultado.getInt("PRECIO_VENTA");
                registro.setTotal(cantidad * precio);
                registro.setPrecio(precio);
                // finalmente, agregar a la coleccion
                lista.add(registro);
            }

            // }
        } catch (SQLException ex) {
            Logger.getLogger(DetalleBoletaDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new RuntimeException("error al buscar todos los detalles de boleta", ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {

            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    Collection<ProductosMasVendidos> buscarMasVendidosEntreFechas(Date fecha1, Date fecha2) {

        Collection<ProductosMasVendidos> lista = new ArrayList<ProductosMasVendidos>();
        java.sql.Date sqlIni = new java.sql.Date(fecha1.getTime());
        java.sql.Date sqlFin = new java.sql.Date(fecha2.getTime());
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = " select distinct d.COD_PRODUCTO, p.NOMBRE, p.PRECIO_VENTA ,sum(d.CANTIDAD) as suma "
                    + "from ADMINISTRADOR.DETALLE_BOLETA d join ADMINISTRADOR.PRODUCTOS p using (COD_PRODUCTO)"
                    + " join ADMINISTRADOR.BOLETA b using (COD_BOLETA) where b.ESTADO = true and b.\"DATE\" between ? and ? "
                    + "group by d.COD_PRODUCTO, p.NOMBRE, p.PRECIO_VENTA order by suma desc";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setDate(1, sqlIni);
            sentencia.setDate(2, sqlFin);
            resultado = sentencia.executeQuery();
            int cantidad = 0;
            int precio = 0;
            while (resultado.next()) {
                ProductosMasVendidos registro = new ProductosMasVendidos();
                registro.setCodProducto(resultado.getString("COD_PRODUCTO"));
                cantidad = resultado.getInt("SUMA");
                registro.setCantidad(cantidad);
                registro.setNombre(resultado.getString("NOMBRE"));
                precio = resultado.getInt("PRECIO_VENTA");
                registro.setTotal(cantidad * precio);
                registro.setPrecio(precio);
                // finalmente, agregar a la coleccion
                lista.add(registro);
            }
        } catch (SQLException ex) {
            Logger.getLogger(DetalleBoletaDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new RuntimeException("error al buscar mas vendidos", ex);
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

}
